package com.blackcat.v2.demo;

public class Startup {

    /**
     *
     *
     * 观察者模式的应用场景：
     * 1、 对一个对象状态的更新，需要其他对象同步更新，而且其他对象的数量动态可变。
     * 2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
     *
     *  LifeCycle(被监听者)
     *    定义了状态
     *    添加、查询、触发监听者
     *
     * 监听事件
     * Class LifeCycleEvent(包含被监听者)
     *    type
     *    data
     *    LifeCycle
     *
     *
     * LifeCycleListener(监听者  包含监听事件)
     *   lifecycleEvent(LifecycleEvent event);
     *
     *
     * Class LifeCycleSupport （工具类）
     *    LifeCycle
     *    LifeCycleListener
     *
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        //实例化两个大灯
        Light leftLight = new Light(" 左 ");
        Light rightLight = new Light(" 右 ");

        //实例化一个发动机
        Engine engine = new Engine();

        //实例化一个汽车
        Car car = new Car();
        car.setLeftLight(leftLight);
        car.setRightLight(rightLight);
        car.setEngine(engine);


        //还可以给上面实现了Lifecycle接口的组件添加监听器
        engine.addLifecycleListener(new MyLifecycleListener() {
                                                @Override
                                                public void lifecycleEvent(MyLifecycleEvent event) {
                                                    //只关心AFTER_START事件
                                                    if (MyLifecycle.AFTER_START.equals(event.getType())) {
                                                        System.out.println("监听到发动机启动了，轰轰轰。。。");
                                                        //这里还可以通过event.getLifecycle()获得engin实例对象，然后做一些业务操作
                                                    } else {
                                                        //这里可以继续判断其他类型的事件，然后做出处理
                                                    }
                                                }
                                            });

        car.addLifecycleListener(new MyLifecycleListener() {
                                             @Override
                                             public void lifecycleEvent(MyLifecycleEvent event) {
                                                 if (MyLifecycle.AFTER_STOP.equals(event.getType())) {
                                                     System.out.println("桑塔拉快停止了,下车吧。。。");
                                                 }
                                             }
                                         });

        //启动汽车
        car.run();

        System.out.println("\n\n\n");

        //模拟让桑塔拉跑3秒
        Thread.sleep(3000);

        //关闭汽车
        car.shutdown();
    }
}
